home *** CD-ROM | disk | FTP | other *** search
- program dir;
-
- {$i-,u-,c-}
-
- type
- registers=record
- ax,bx,cx,dx,bp,si,di,ds,es,flags:integer;
- end;
-
- char80arr=array[1..80] of char;
- string80=string[80];
-
- var
- dta:array[1..43] of byte;
- dtaseg,
- dtaofs,
- setdtaseg,
- setdtaofs,
- error,
- i,j,
- att,option:integer;
- regs:registers;
- buffer,
- namr:string80;
- mask:char80arr;
-
- procedure setdta(segment,offset:integer;var error:integer);
-
- begin
- regs.ax:=$1a00;
- regs.ds:=segment;
- regs.dx:=offset;
- msdos(regs);
- error:=regs.ax and $ff;
- end;
-
- procedure getcurrentdta(var segment,offset:integer; var error:integer);
-
- begin
- regs.ax:=$2f00;
- msdos(regs);
- segment:=regs.es;
- offset:=regs.bx;
- error:=regs.ax and $ff;
- end;
-
- procedure getoption(var option:integer);
- var
- ch:char;
-
- begin
- ch:='?';
- option:=1;
- while (ch='?') do
- begin
- write('File option to use, [?] for list :');
- readln(ch);
- writeln;
- case(ch) of
- '1':option :=1;
- '2':option :=7;
- '3':option :=8;
- '4':option :=16;
- '5':option :=22;
- '6':option :=31;
- '?':begin
- writeln('FIle options are : ');
- writeln;
- writeln('[1] for standard files [default].');
- writeln('[2] for system or hidden files');
- writeln(' and standard files');
- writeln('[3] for volume label');
- writeln('[4] for directories and standard files');
- writeln('[5] for directories,hidden or system');
- writeln(' files and standard files');
- writeln('[6] same as 5, but with volume');
- writeln(' label included');
- writeln;
- end;
- else
- option :=1;
- end; {case}
- end;
- end;
-
- procedure getfirst(mask:char80arr;var namr:string80;segment,offset:integer;option:integer; var error:integer);
-
- var
- i:integer;
-
- begin
- error:=0;
- regs.ax:=$4e00;
- regs.ds:=seg(mask);
- regs.dx:=ofs(mask);
- regs.cx:=option;
- msdos(regs);
- error:=regs.ax and $ff;
- i:=1;
- repeat
- namr[i]:=chr(mem[segment:offset+29+i]);
- i:=i+1;
- until (not(namr[i-1] in [' '..'~']));
- att:=mem[segment:offset+21];
- namr[0]:=chr(i-1);
- end;
-
- procedure getnextentry(var namr:string80; segment,offset:integer;
- option:integer;var error:integer);
-
- var
- i:integer;
-
- begin
- error:=0;
- regs.ax:=$4f00;
- regs.cx:=option;
- msdos(regs);
- error:=regs.ax and $ff;
- i:=1;
- repeat
- namr[i]:=chr(mem[segment:offset+29+i]);
- i:=i+1;
- until (not(namr[i-1] in [' '..'~']));
- att:=mem[segment:offset+21];
- namr[0]:=chr(i-1);
- end;
-
- begin
- for i:=1 to 21 do dta[i]:=0;
- for i:=1 to 80 do
- begin
- mask[i]:=chr(0);
- namr[i]:=chr(0);
- end;
- namr[0]:=chr(0);
- writeln('QDL version @.0A');
- writeln;
- getcurrentdta(dtaseg,dtaofs,error);
- if (error<>0 ) then
- begin
- writeln('unable to get current dta');
- writeln('program aborting');
- halt;
- end;
- setdtaseg:=seg(dta);
- setdtaofs:=ofs(dta);
- setdta(setdtaseg,setdtaofs,error);
- if (error<>0) then
- begin
- writeln('Cannot reset dta');
- writeln('Program aborting');
- halt;
- end;
- error:=0;
- buffer[0]:=chr(0);
- getoption(option);
- if (option<>8) then
- begin
- write('file mask :');
- readln(buffer);
- writeln;
- end;
- if (length(buffer)=0 ) then
- buffer:='????????.???';
- for i:=1 to length(buffer) do
- mask[i]:=buffer[i];
- getfirst(mask,namr,setdtaseg,setdtaofs,option,error);
- if (error=0) then
- begin
- if (option <> 8) then
- begin
- writeln('Directory of : ',buffer);
- writeln;
- end;
- if option<>16 then
- writeln(namr)
- else
- if att=16 then
- writeln(namr);
- end
- else
- if option=8 then
- writeln('Volume label not found')
- else
- writeln('File ''', buffer, ''' not found.');
- while (error=0) do
- begin
- getnextentry(namr,setdtaseg,setdtaofs,option,error);
- if (error=0) then
- begin
- if option<>16 then
- begin
- write(namr);
- if att=16 then writeln (' <DIR> ') else writeln
- end
- else
- if att=16 then
- writeln(namr);
- end;
- end;
- setdta(dtaseg,dtaofs,error);
- end.
-